<?php

class DXF_Parser implements Iterator
{
	private $_file;
	private $_parsedData = array();
	private $_position = 0;

	
	public function __construct()
	{
		$this->_file = file(dirname(__FILE__)."/TestBuilding.dxf", FILE_IGNORE_NEW_LINES);
		$this->_position = 0;
		$this->_parse();
		
		
	}
	
	public function printr()
	{
		print "<pre>";
		print_r($this->_file);
		print "</pre>";
		
		
	}
	
	private function _parse()
	{
		//Qui va un ciclo esterno per gestire le varie entità
		
		$coordinate = array(10,20,30,11,21,31,12,22,32,13,23,33);
		$entities = array("3DFACE"); //array per le varie entità
		//Creo un array che contiene gli indici per trovare l'entità all'interno del file  
		$keys = (array_keys($this->_file, $entities[0]));
		$j = 0; //indice dell'array _parsedData[]
		$app = array(); //array d'appoggio
		$app2 = array();
		//Ciclo generale che estrapola indice e valore dall'array di indici
		foreach ($keys as $k => $value)
		{
			$z1 = 0; //indice array d'appoggio1
			$z2 = 0; //indice array d'appoggio2
			//Se il valore trovato è uguale a quello dell'entità cercata e il secondo campo successivo è una stringa
			if(($this->_file[$value]==$entities[0])&&(is_string($this->_file[$value+2])))
			{
				//Inserisco nell'array d'appoggio la stringa che delimita l'inizio della zona di interesse
				$app[$z1] = $this->_file[$value+2];
				$z1++;
				$app[$z1] = $this->_file[$value-2];
				$z1++;
				//Ciclo che mi permette di selezionare le coordinate cercate all'interno di 
				//un preciso intervallo di interesse nel file. L'intervallo lo prendo dai valori dell'array di indici 
				for ($i = $value; isset($keys[$k+1]) && $i < $keys[$k+1]; $i++) 
				{
					//Se il valore analizzato è uguale a uno di quelli inseriti nell'array coordinate
					//allora inserisco nell'array finale il valore del campo successivo
					//ovvero la coordinata vera e propria
					if(in_array($this->_file[$i], $coordinate))
					{
						$app2[$z2]= $this->_file[$i+1];
						$z2++;
						//Questo if serve a raggruppare ogni coordinata in un singolo array
						If ($z2 ==3)
						{
							$app[$z1] = $app2;
							$z1++;
							$z2 = 0;
						}
					}
				}
			}
			if ($z1 == 6) {
				$this->_parsedData[$j] = $app;
				$j++;
				$app = null;
			}
			$z1 = 0;
		}
		///Ultima superficie
		$z1 = 0; //indice array d'appoggio1
		$z2 = 0; //indice array d'appoggio2		
		$app[$z1] = $this->_file[$value+2];
		$z1++;
		$app[$z1] = $this->_file[$value-2];
		$z1++;
		while(true)
		{
			if(in_array($this->_file[$value], $coordinate))
			{
				$app2[$z2]= $this->_file[$value+1];
				$z2++;
				//Questo if serve a raggruppare ogni coordinata in un singolo array
				If ($z2 ==3)
				{
					$app[$z1] = $app2;
					$z1++;
					$z2 = 0;
				}
			}
			if ($z1 == 6) {
				$this->_parsedData[$j] = $app;
				break;
			}
			
			$value++;
		}
				
	}
	
	public function getParse()
	{
		return $this->_parsedData;
	}
	
	//Metodi dell'iterator
	function rewind() 
	{
		$this->_position = 0;
	}
	
	function current() 
	{
		return $this->_parsedData[$this->_position];
	}
	
	function key() 
	{
		return $this->_position;
	}
	
	function next() 
	{
		++$this->_position;
	}
	
	function valid() 
	{
		return isset($this->_parsedData[$this->_position]);
	}
	
	function hasNext()
	{
		return isset($this->_parsedData[$this->_position+1]);
	}
	function rewindTo($n)
	{
		$_n = $this->_position;
		$this->_position = $n;
		if (!$this->valid()) {
			$this->_position = $_n;
		}
	}
	
	
}
